home *** CD-ROM | disk | FTP | other *** search
/ PC-SIG: World of Games / PC-SIG World of Games (CDRM1080710) (1993).iso / ENT / DISK1536.ZIP / LINSOLVE.LIS < prev    next >
File List  |  1989-09-27  |  23KB  |  518 lines

  1.                            - 1 -
  2. 27th September, 1989                                       (Ver 2.9)
  3.  
  4. About TSLIN in General 
  5. ======================
  6.  
  7. Apply  a question  mark ? with the program  call for the description
  8. of the program, i.e. use LINSOLVE ? for the short instructions.
  9.  
  10. The  public domain version   of the  TSLIN package  may be  used and
  11. distributed   freely    for   NON-COMMERCIAL,     NON-INSTITUTIONAL,
  12. PRIVATE   usage,  provided it  is not  changed in  any way.  For ANY
  13. other use (and/or the larger  version)  contact   the   author.   No
  14. unauthorized charge  for  distributing this  program is allowed.  No
  15. part of the package may be distributed separately.
  16.  
  17. An individually  registered version is  strictly for the  use of the
  18. registrant. An identical program may NOT be running on more than one
  19. computer at a time. Likewise a site licensed copy must not be run on
  20. any  machine outside the  registered site. A  registration gives the
  21. right  to use the program as stated here. It does not cover tutoring
  22. or similar user support.
  23.  
  24. The  LINSOLVE program  is under  development. Comments  and contacts
  25. are welcome. Feedback is solicited!
  26. Internet address: ts@chyde.uwasa.fi       (preferred)
  27. Funet address:    VAKK::SALMI
  28. Bitnet address:   SALMI@FINFUN
  29. FidoNet address:  2:515/1 (Micro Maniacs Opus; To: Timo Salmi).
  30.  
  31. The  author shall not be liable to the user for any direct, indirect
  32. or  consequential loss arising from the use of, or inability to use,
  33. LINSOLVE or this  package, or  any other  program or  file howsoever
  34. caused. No warranty is  given that  the system  will work  under all
  35. circumstances.
  36.  
  37. Timo Salmi
  38. Professor of Accounting and Business Finance
  39. School of Business Studies, University of Vaasa
  40. P.O.BOX 297, SF-65101 Vaasa, Finland
  41.  
  42. CONTENTS:
  43.  
  44.     1. Introduction
  45.     2. Linear Programming
  46.     3. Sensitivity Analysis
  47.     4. Floating Point Significance
  48.     5. Linear Goal Programming
  49.     6. Specialist's Corner
  50.     7. Other Computers and Programs
  51.     8. Release Notes for linsolve
  52.     9. Selected References on Linear and Linear Goal Programming
  53.  
  54.  
  55.  
  56. .page
  57.                            - 2 -
  58.  
  59.  
  60. 1. INTRODUCTION
  61.  
  62.    LINSOLVE solves linear programming ('LP') problems interactively.
  63. LINSOLVE can also be used to solve linear GOAL programming problems.
  64. For more details, see the later pages.
  65.    The   maximum  capacity  of  the  program  is  80  variables,  55
  66. constraints,  and 10  objectives. Notice,  however, that  the public
  67. domain (PD) version will not handle more than 15 variables.
  68.    You  give your problem in an 'as is' facsimile format from a file
  69. or keyboard. The program will  ask  your  choices  for  the  options
  70. available.  You  have the  choice of  maximizing or  minimizing, and
  71. even printing out the Simplex-tableaux should you so wish.
  72.  
  73.  
  74. 2. LINEAR PROGRAMMING
  75.  
  76. Consider the following LP-problem
  77.  
  78.                                         (Name for row:)
  79.    maximize z = 2X1 + 3X2               (Z)
  80.    subject to
  81.                  X1 + 2X2 +  X3 ≤ 13    (COND1)
  82.                              X3 =  5    (COND2)
  83.                 -X1 +  X2 + 2X3 ≥  8    (COND3)
  84.                          3 ≤ X3 ≤  6    (LO/UP)
  85.                  X1,X2,X3 ≥ 0
  86.  
  87. Write LINSOLVE to call the program. 
  88.  
  89.    LINSOLVE  first  prompts for   the method  of  input (keyboard or
  90. file),  then  for the constraints,  and  next for the  objective(s).
  91. The problem is given  to  LINSOLVE  in  facsimile  format  from  the
  92. console or an ordinary text file:
  93.  
  94. COND1:  X1 + 2X2 +  X3 < 13
  95. COND2:              X3 =  5     !exclamation marks (!) can be
  96. COND3: -X1 +  X2 + 2X3 >  8     !used to include comments
  97. LO:                 X3 >  3     !after and/or between rows
  98. UP:                 X3 <  6
  99. END
  100. Z:     2X1 + 3X2
  101. END                             !END can be replaced by LOPPU
  102.  
  103.    Each variable, constraint and objective must  be  named  using  a
  104. unique  name.  The name  of a constraint,  objective or variable can
  105. be up   to 10  characters  long.   Each constraint   (and objective)
  106. name must  be followed by colon (:) to  separate it from the rest of
  107. the row.
  108.  
  109. .page
  110.                            - 3 -
  111.  
  112.  
  113.    Spaces are ignored by   the   program.   You   can,   of  course,
  114. utilize spaces to clarify the structure of the problem.
  115.    Lower  and  upper cases  are not  differentiated.  (Thus e.g. "b"
  116. and  "B" are  treated the  same.) The  alphabet consist  of A-Z. 
  117.    A row   can be continued using an   ampersand (&). E.g. the third
  118. constraint could have been given as
  119.       COND1:  X1 + 2X2 &
  120.               + X3 < 13
  121. Alternatively, * can be  used  instead  of  &  as  the  continuation
  122. marker.
  123.    LINSOLVE  checks  and reports syntax  errors before proceeding to
  124. solve the problem. If the input is taken from a file, the program is
  125. aborted when an  error is encountered.  If the task  is entered from
  126. the keyboard,  and the error is not  fatal, LINSOLVE prompts for the
  127. relevant constraint (or objective) again.  
  128.    The  program also  prompts  for  the  choice  of  output   device
  129. (screen  or  file),  whether  the objective is  to minimize (if not,
  130. then maximize), and whether the Simplex-tableaux are printed.
  131.    Using systematic   extension such  as  .SOL  in the   output file
  132. name is commendable if output is directed to a file.
  133.    Output can be directed to the screen by giving CON, or no name at
  134. all, to the output file.
  135.  
  136.  
  137. 3. SENSITIVITY ANALYSIS
  138.  
  139.    LINSOLVE  optionally  performs  a  sensitivity  analysis  on  the
  140. coefficients  of the objective function, and the right-hand sides of
  141. the constraints. 
  142.    The sensitivity analysis  for the  objective function  solves the
  143. range of objective  function coefficients  which retain  the optimum
  144. solution. (The  definition of retaining an  optimum solution is that
  145. the variables in the basis remain the same. In the case of objective
  146. function  sensitivity analysis also the values of the optimum values
  147. of the variables remain unchanged.)
  148.    The sensitivity analysis for  the  right-hand  sides  give  their
  149. corresponding ranges retaining the optimum basis. (In this case, the
  150. values of the variables in the optimum basis would be changed.)
  151.    The  sensitivity analysis is only performed if certain conditions
  152. are met.  First, it is  limited to linear  programming problems with
  153. one objective.  Sensitivity analysis  is thus  not performed  in the
  154. case  of linear goal  programming problems. Second,  the analysis is
  155. performed only if the problem has a feasible, non-infinite solution.
  156. Third,  although LINSOLVE can,  and will, solve  problems which have
  157. negative  right-hand sides, no sensitivity analysis is performed for
  158. such tasks.
  159.  
  160. .page
  161.                            - 4 -
  162.  
  163.  
  164. 4. FLOATING POINT SIGNIFICANCE
  165.  
  166.    When   formulating the original LP problem  do not use very large
  167. or  small coefficients in  the   constraints  or  the  objective(s).
  168. Although seldom recognized,  this  requirement  is  endemic  in most
  169. linear  programming codes. This  results  from  the  fact  that  the
  170. accuracy  of  real  numbers  is  always  more  or  less  limited  in
  171. computing,  even  if  mathematically  linear  programming  poses  no
  172. problems.
  173.  
  174. Thus, instead of e.g
  175.    400000X1 + 800000X2 < 2000000
  176. or
  177.    0.004X1 + 0.008X2 < 0.02
  178. use
  179.    4X1 + 8X2 < 20
  180.  
  181.    In   particular, do  not to mix   large and small coefficients in
  182. the same problem.
  183.    In   business applications, a change of  unit of the variables is
  184. often a useful trick for  avoiding  problems  caused  by  computers'
  185. limited accuracy.
  186.    Also avoid   the mistake  of giving   the same  constraint twice,
  187. since such linear  dependency   can   make   the   Simplex-algorithm
  188. fail.
  189.    If the program terminates in an error message:
  190.       Runtime error 205 at xxxx:xxxx.
  191. which indicates a  floating point overflow,  it is not  a failure of
  192. the program code, but a result of a bad scaling of your LP task.
  193.  
  194.  
  195. 5. LINEAR GOAL PROGRAMMING
  196.  
  197.    As   with linear  programming, it  is  assumed  that the  user is
  198. fully  familiar with the concept of linear goal programming. If not,
  199. the  text-books  by  Sang  M.  Lee  (Goal  Programming  for Decision
  200. Analysis)  and James P. Ignizio  (Goal Programming) are recommended.
  201. See the references at the end of these instructions.
  202.    Consider  the following linear goal  programming problem where P1
  203. denotes the  highest priority level. Note  that the standard of goal
  204. programming is minimization.
  205.  
  206.    Minimize Z = P1(d2+) + 2P2(d1-) + 3P2(d2-)
  207.    subject to
  208.                  X1 + 2X2                   > 2   (ROW1)
  209.                 4X1 + 2X2 + d1-             = 4   (ROW2)
  210.                 3X1 + 5X2       + d2- - d2+ = 3   (ROW3)
  211.                        X2                   < 5   (ROW4)
  212.                  X1,X2,d1-,d2-,d2+ > 0
  213.  
  214. .page
  215.                            - 5 -
  216.  
  217.  
  218. The corresponding input to LINSOLVE should be
  219.  
  220. ROW1:  X1 + 2X2                   > 2
  221. ROW2: 4X1 + 2X2 + D1N             = 4
  222. ROW3: 3X1 + 5X2       + D2N - D2P = 3
  223. ROW4:        X2                   < 5
  224. END
  225. P1: D2N           !Highest priority first
  226. P2: 2D1N + 3D2N
  227. END
  228.  
  229.  
  230. 5. SPECIALIST'S CORNER
  231.  
  232. The Algorithm
  233.  
  234.    LINSOLVE  applies   the   two-stage  Simplex-method.  (In  linear
  235. goal   programming    a   corresponding   multiple-stage    Simplex-
  236. method.)  In  both   cases,   artificial  variables  and   objective
  237. (called   "Extra" in  LINSOLVE_EXE) are added to the problem. In the
  238. first stage the  algorithm  tries  to  get  rid  of  the  artificial
  239. variables. (If  it can't, the  solution of the   original problem is
  240. not feasible.  If this is the case, LINSOLVE duly reports the fact.)
  241. In the subsequent stage(s) LINSOLVE  finds   the  solution   to  the
  242. problem given  by the user.
  243.    If the  user request LINSOLVE to  print the Simplex-tableaux, the
  244. Extra    objective   and     Extra    variables     are    included.
  245. Similarly,  the Extra objective  appears  on  the   listing  of  the
  246. optimum  solution.  (Its value  will become   zero, if  the original
  247. problem has a feasible solution.)
  248.  
  249.  
  250. Altering the zero criterion
  251.  
  252.    The accuracy   of  the   floating  point   arithmetic  is  eleven
  253. significant digits in  the Turbo  Pascal 4.0  (internal) arithmetic.
  254. Round-off errors  tend accumulate   in  the   Simplex-algorithm.  To
  255. counter  this  fact, all elements less  than a zero-limit (5E-6) are
  256. set  to exact zero  at each iteration.  An experienced user may want
  257. to alter this limit. This can be done by giving the new value as the
  258. parameter of the program call. For example: LINSOLVE 0.0001
  259.    The  optional   statistics  include  the   number  of  round-offs
  260. performed by  the program. The  smaller the figure,  the less likely
  261. the problems due to the floating point arithmetic.
  262.  
  263. .page
  264.                            - 6 -
  265.  
  266. 7. OTHER COMPUTERS AND PROGRAMS
  267.  
  268.    The LINSOLVE program  is  also  available  for  the  Sinclair  QL
  269. computer. It is part of a Public Domain library for QUANTA members. 
  270.    LINSOLVE  has also been programmed for the VAX 11/750 computer at
  271. the Vaasa University, by  the  author,  but  the  input  and  output
  272. commands  of the VAX "TAVOPT" are in Finnish, and the program is not
  273. public domain.
  274.    The package for drawing LP programs of two dimensions, TSDRAW, is
  275. available separately for the PC.
  276.  
  277.  
  278. 8. RELEASE NOTES
  279.  
  280.    In version 1.1 a  bug preventing  the input  of more  than (only)
  281. eleven constraints was corrected.
  282.  
  283.    In version 1.2 the sensitivity analysis was added to the program.
  284. Also  some minor  improvements were  made in  the defaults,  and the
  285. information  about the solution, when the  solution is directed to a
  286. file. The  algorithm has been  tested with more  problems with known
  287. solutions. The  rare special situations  where the Simplex-algorithm
  288. is known to fail, have not yet been tested. (See notes on ver 2.1.)
  289.  
  290.    In version 1.3 some minor stylistic changes were made.
  291.  
  292.    In  version 1.4 the possibility of entering a header on each page
  293. of  output was added. If the very first line of the task starts with
  294. !! as in
  295.             !!A tiny task
  296.             E1: X1 + 2X2 < 2
  297.             END
  298.             MAX: 3X1 + 5X2
  299.             END
  300. then the text  "A tiny task"  is used as  a header for  each page of
  301. output,  if the output is directed to a file. !! indicates a header,
  302. a single ! an ordinary comment.
  303.  
  304.    In version 1.5 more error checks have been added to safeguard the
  305. user  against giving input that could not be parsed into a proper LP
  306. format. E.g. it is  now  checked  that  a  continuation  row  really
  307. follows  after the use the  the continuation marker (&  or *) on the
  308. previous row.
  309.  
  310.    Version  1.6 introduces a built-in help  to linsolve. Help can be
  311. invoked  by entering ? when the program asks for input. From version
  312. 1.6  it is possible to use the  Scandinavian characters (Å, Ä, Ö) in
  313. the variable, constraint and objective names.
  314.  
  315. .page
  316.                            -  7 - 
  317.  
  318.    Version 1.7 uses an improved directory utility. If the input file
  319. is not found, the user is given the option of listing directories on
  320. the screen without having to exit LINSOLVE. The directory mask (file
  321. definition) is now much more relaxed, and almost the same as for the
  322. MS-DOS dir  command. More information  on this feature  can be found
  323. within the TSUTIL package. (See the TSPROG.INF file.)               
  324.  
  325.    Version 1.8 introduces mostly internal changes not visible to the
  326. user.
  327.  
  328.    In version  1.9 an attempt to rewrite  a read-only output file no
  329. longer crashes the program.
  330.  
  331.    Version  2.0 improves  the speed  of reading  the problem  from a
  332. file.
  333.  
  334.    Version 2.1: A linear programming problem can generally be stated
  335. as
  336.         max  cx
  337.         s.t.
  338.              Ax ≤ b
  339.               x ≥ 0
  340. Version  2.1 introduces an index of the accuracy of the solution. In
  341. linear programming computer implementations the round-off errors may
  342. cause problems,  and even deviations from  optimality. To assess the
  343. effect of  these problems on the current  task the final tableau the
  344. is recalculated from the  inverse  matrix  of  the  base.  Then  the
  345. original  solution tableau is compared with the recalculated tableau
  346. by  defining four different (in)accuracy measures. These are the sum
  347. of absolute deviations  in the left-hand  side matrix A,  the sum of
  348. absolute deviations  in the solution  vector b, and  sum of absolute
  349. deviations   in  the  simplex  coefficients.  The  simplex-algorithm
  350. version  used in this program seeks the optimum by trying to get all
  351. the simplex coefficients to be non-positive. The fourth (in)accuracy
  352. measure is  the  sum  of  the  free  recalculated  positive  simplex
  353. coefficients. The  four inaccuracy measures  are called respectively
  354. a-inaccuracy, b-inaccuracy, z-inaccuracy,  and  non-optimality.  The
  355. overall inaccuracy reported together with the solution is simply the
  356. sum of these four inaccuracies.
  357.    Another novel feature in version  2.1  is  checking  the  special
  358. cases  caused by  linear dependencies  and point-like  solutions. In
  359. both  these cases (see the linear programming literature) artificial
  360. (Extra)  variable(s) may remain in the optimal basis but as zero(s).
  361. If the solution of a linear programming or a linear goal programming
  362. problem is non-feasible then the value of the artificial variable(s)
  363. staying in basis  will be  non-zero. These  zero/non-zero conditions
  364. are now detected by LINSOLVE.
  365.  
  366. .page
  367.                            - 8 -
  368.  
  369.    Parsing the  problem (i.e. reading and  interpreting it) has been
  370. made faster, as has been computing the iterations.
  371.    The  range of the zero described  in an earlier section "Altering
  372. the  Zero Criterion" has been made wider, and it is now possible not
  373. to  alter the small elements at all. This is achieved by calling the
  374. program by LINSOLVE 0. This  is  not  advisable,  though,  since  it
  375. usually leads to suboptimal solutions.
  376.  
  377.    Version  2.2 introduces the choice between starting each new page
  378. of  output (when directed to  a file) either with  a formfeed or two
  379. blank lines (earlier  it  was  always  a  formfeed).  If  output  is
  380. directed to the printer, that is to the file PRN, the user now has a
  381. choice of the left margin between 0 and 20.
  382.  
  383.    Version   2.3:  The  default  output  gives  the  values  of  the
  384. variables, slacks, objectives,  and  the  shadow  prices,  i.e.  the
  385. simplex coefficients of  the  variables  in  the  first  basis.  The
  386. simplex coefficients  of the the original  variables have been added
  387. to the default output in version 2.3. They are given under the title
  388. REDUCED  COST. (For interpreting the shadow prices and reduced costs
  389. see the appropriate literature.)
  390.    If the output is directed to a printer (that is to file PRN), the
  391. online/offline  status of the printer is now tested immediately, and
  392. the user  is notified.  (In the  program code,  this is  achieved by
  393. using the interrupts for the testing, instead of IOResult checking.)
  394.  
  395.    Version  2.4: The program  has been recompiled  with Turbo Pascal
  396. 5.0. The bug  preventing reading  a read-only  file has  been fixed.
  397. (This bug was actually  due  to  Turbo  Pascal  4.0  documentation.)
  398. Furthermore, the program  now augments  pathnames to  filenames when
  399. appropriate.
  400.  
  401.    Version  2.5: Most importantly, new files  have been added to the
  402. package. See  the  separate  documentation  in  MPS2EQU.INF  and  in
  403. chapter 9.  As to linsolve, if an input  file is not found, the user
  404. has been  given  the  option  of  listing  directories  from  within
  405. linsolve. This directory routine  has  been  rewritten  for  a  more
  406. relaxed  syntax and tighter code. A bug in the heap control has been
  407. fixed. This  caused problems in rare cases  during the out of memory
  408. condition.   The  maximum  number  of   objectives  in  linear  goal
  409. programming was one too small because of a bug. This has been fixed.
  410.  
  411.  
  412. .page
  413.                            - 9 -
  414.  
  415.  
  416.    Version 2.6: Modern technology (sometimes not so modern :-) makes
  417. it possible to project a computer screen using an overhead projector
  418. onto  a wall screen e.g. for classroom  usage. In trying this out, I
  419. noticed,  that it would be useful to have the option of changing the
  420. linsolve colors. The consequent new usage of the LINSOLVE call is
  421.  
  422.    LINSOLVE [/fx (foreground color)] [/bx (background color)]
  423.             [/zxx.x (zero criterion)] [/h (help)]
  424.  
  425. The simplest  way of changing the colors  is using just LINSOLVE /f,
  426. which  will give you a white text on black background. The /f and /b
  427. parameters  can include  a color  number ranging  from 0-15  for the
  428. foreground,  and 0-7 for the background.   For the color map, either
  429. experiment, or see a Turbo Pascal manual for TextColor constants.
  430.    I  have made a couple  of minor internal changes  to speed up the
  431. program at certain phases. Also, the help screen can now be directed
  432. to a file, or to the printer. For this, use LINSOLVE /h > PRN.
  433.  
  434.    Version  2.7: This revision includes  two major enhancements. The
  435. capacity  of the program  has been increased  from 55x80 constraints
  436. and variables  to 80x120. The second  enhancement is the possibility
  437. of input recall with line-editing.
  438.    A well-known bottle-neck of MsDos is the fact that the Intel 808x
  439. processors limit  array sizes to  64K. To use  larger arrays special
  440. techniques are needed.  LINSOLVE version  2.7 employs  the so-called
  441. huge-arrays  method. This means enhanced capacity, but also slightly
  442. slower code.  LINSOLVE still runs  in the memory,  and remains fast,
  443. contrary to  many other LP  programs using sloo..oow  disk access in
  444. iterating.
  445.    The  possibility of input recall with line-editing is introduced.
  446. This means  that in  giving input  from the  keyboard, you  have the
  447. following   extra  input  keys  available:  Home,  End,  CursorLeft,
  448. CursorRight,  CursorUp, Delete, and Esc. CursorUp is the recall key.
  449. The  others are self-explanatory. This option is particularly useful
  450. in giving the linear programming task from the keyboard in classroom
  451. usage. That  is the  primary reason  why I  added this  feature into
  452. linsolve.
  453.  
  454.    Version 2.8:  The  public  domain  task  size  limits  have  been
  455. increased to 55x25 from  55x15.  Line-editing  has  been  made  more
  456. context sensitive, and the Insert key has been made functional.
  457.  
  458.    Version 2.9:  If output  is directed  to a  file, the  file ready
  459. message now also  contains the  file size  in bytes.  The acceptable
  460. file names now also include the ( ) and _ characters.
  461.  
  462. .page
  463.                            - 10 -
  464.  
  465.  
  466. 9. SELECTED REFERENCES ON LINEAR AND LINEAR GOAL PROGRAMMING
  467.  
  468. Gass,  Saul I. Linear Programming:  Methods and Applications. Second
  469.   edition. McGraw-Hill Book Company, 1964.
  470.  
  471. Hadley,  G. Linear  Programming. Addison-Wesley  Publishing Company,
  472.   1962. (This is  one of the  classics on the  mathematics of linear
  473.   programming.)
  474.  
  475. Ignizio, James  P.   Goal  Programming  and  Extensions.   Lexington
  476.   Books, 1976.
  477.  
  478. Ignizio, James p.   "A  Review  of  Goal  Programming:  A  Tool  for
  479.   Multiobjective Analysis",  Journal  of  the  Operational  Research
  480.   Society, Vol. 29, No. 11 (November 1978), ss. 1109-1119.
  481.  
  482. Jennergren, Peter L.  "Linear programming on  a micro -  The case of
  483.   the  Apple II", European Journal of Operational Research, Vol. 19,
  484.   No. 2 (February 1985), pp. 212-216.
  485.  
  486. Jääskeläinen,  Veikko.    Lineaarinen  optimointi   ja  budjetointi.
  487.   Ekonomia-sarja 18.  Tapiola: Weilin+Göös, 1972.
  488.  
  489. Jääskeläinen,  Veikko.  Linear  Programming  and  Budgeting.  Malmö,
  490.   Sweden: Student-litteratur,  1975.  (One  of  the  very  few  good
  491.   applications oriented text-books  on  the  utilization  of  linear
  492.   programming. Covers also linear goal programming.)
  493.  
  494. Kallio,  Markku. A  Corporate Planning  Model. Research  Paper D-17.
  495.   Helsinki School of Economics, January 1977.
  496.  
  497. Lee,  Sang M.  Goal Programming for Decision Analysis. Philadelphia:
  498.   Auerbach Publishers Inc., 1972.  (out of print?)
  499.  
  500. Perälä,    Tarja.    Tavoiteoptimointi    ja   investointipäätökset.
  501.   Tutkielma   kvantitatiivisen  yritysanalyysin  koulutusohjelmassa.
  502.   Vaasan korkeakoulu 1982. (Sisältää kattavan lähdeluettelon.)
  503.  
  504. Salmi, Timo. Lineaarinen optimointi ja sen soveltaminen. Täydennetty
  505.   painos.  Vaasan  korkeakoulu,  1981.  (Yksinkertaistettu  johdatus
  506.   aiheeseen.)
  507.  
  508. Schniederjans, Mark  J.  Linear  Goal  Programming.  Princeton,  New
  509.   Jersey:  Petrocelli  Books,  1984.  (Contains  a  lot  of  further
  510.   references.)
  511.  
  512. Stadler, Hartmut  &  Maren  Groenenveld  &  Heidrun  Hermanssen.  "A
  513.   Comparison  of LP  Software on  Personal Computers  for Industrial
  514.   Applications",  European Journal of Operational Research. Vol. 35,
  515.   No. 2 (May 1988), pp. 146-159.
  516.  
  517.  
  518.